from django.shortcuts import render,redirect
# 导入app01的models包
from app01 import models
# 分页组件封装
from app01.utils.pagination import Pagination
# form导入
from app01.utils.form import UserModelForm,PrettyModelForm,PrettyEditModelForm


def user_list(request):
    """ 用户管理 """
    # 获取数据库中用户的数据，得到一个[对象1，对象2，对象3]
    queryset = models.UserInfo.objects.all()
    """ 用python的语法加djongo框架获取数据
    for obj in queryset:
        # 这里如果不对obj.create_time进行处理得到是一个这个格式的时间日期
        # 1 刘德华 1998.68 2023-01-11 00:00:00+00:00 <class 'datetime.datetime'>
        # 2 张惠妹 1008.68 2024-01-11 00:00:00+00:00 <class 'datetime.datetime'>
        # print(obj.id,obj.name,obj.account,obj.create_time,type(obj.create_time))
        # 这里性别也要处理，不处理默认显示的1or2,使用get_gender_display()方法(djongo封装)，得到是gender男或女
        # 1 刘德华 1998.68 2023-01-11 1
        # 2 张惠妹 1008.68 2024-01-11 2
        # obj.depart.title这里不要写depart_id，因为depart是一个对象，这样写获取到的是对应的部门名称而不是部门ID，
        # 去关联的表中取到title对象
        print(obj.id,obj.name,obj.account,obj.create_time.strftime("%Y-%m-%d"),
              obj.get_gender_display(),obj.depart.title)
    """
    # 将封装好的分页组件拿过来
    page_object = Pagination(request,queryset,page_size=15)
    context = {
        "queryset": page_object.page_queryset,
        "page_string": page_object.html(),
    }
    # 将数据作为参数传递到前端
    return render(request,'user_list.html', context)

def user_add(request):
    """ 添加用户 原始方法"""
    # GET请求
    if request.method == 'GET':
        context = {
            'gender_choices': models.UserInfo.gender_choices,
            'depart_list': models.Department.objects.all(),
        }
        # 把性别和部门数据作为字典参数传递给前端做select选择
        """
        gender_choices = (
            (1, "男"),
            (2, "女")
        )
        gender = models.SmallIntegerField(verbose_name="性别", choices=gender_choices)
        """
        return render(request,'user_add.html',context)
    # POST请求,获取用户提交的数据
    user = request.POST.get('user')
    pwd = request.POST.get('pwd')
    age = request.POST.get('age')
    account = request.POST.get('ac')
    ctime =request.POST.get('ctime')
    gender = request.POST.get('gd')
    depart_id = request.POST.get('dp')

    # 把数据添加到数据库中
    models.UserInfo.objects.create(name=user,password=pwd,age=age,
                                   account=account,create_time=ctime,
                                   gender=gender,depart_id=depart_id)
    return redirect("/user/list/")

""" 从这里开始，基于ModelForm的示例 """
# class UserModelForm(BootStrapModelForm):
#     name = forms.CharField(
#         min_length=4,
#         label="用户名",
#         widget=forms.TextInput(attrs={"class": "form-control"})
#     )
#
#     class Meta:
#         model = models.UserInfo
#         fields = ["name","password","age","account","gender","create_time","depart"]
#     # 已继承BootStrapModelForm类，下面的代码不用写了。继承bootstrap样式
#     # def __init__(self, *args, **kwargs):
#     #     super().__init__(*args, **kwargs)
#     #     # 循环ModelForm中的所有字段，给每个字段做widget插件，添加了class="form-control"
#     #     for name,field in self.fields.items():
#     #         # 加"placeholder": field.label，输入框显示提示信息
#     #         field.widget.attrs = {"class": "form-control","placeholder": field.label}

def user_model_form_add(request):
    """" 添加用户（ModelForm版本）"""
    if request.method == 'GET':

        form = UserModelForm()
        return render(request,'user_model_form_add.html',{'form':form})
    # 用户POST提交数据，做数据校验 ，把UserModelForm实例化，得到form的数据，放在前端渲染
    form = UserModelForm(data=request.POST)
    # 数据正确则直接返回用户列表页面
    if form.is_valid():
        # 添加数据
        form.save()
        return redirect("/user/list/")
    # 校验失败则提示错误信息
    return render(request,'user_model_form_add.html',{'form':form})

def user_edit(request,nid):
    """ 编辑用户信息 """
    # 根据ID去数据库获取要编辑的哪一行数据（对象）,这一行写在最外面，因为POST请求更新也会用到这个数据
    row_object = models.UserInfo.objects.filter(id=nid).first()
    if request.method == 'GET':
        # 首先是GET请求，因为要把编辑用户的数据默认的写在输入栏中
        form = UserModelForm(instance=row_object)
        return render(request,'user_edit.html',{'form':form})
    # POST请求,把修改的信息更新
    form = UserModelForm(data= request.POST,instance=row_object)
    # 校验正确
    if form.is_valid():
        # 默认保存的是用户输入的所有数据
        form.save()
        return redirect("/user/list/")
    # 否则，把错误的信息显示在编辑用户页面
    return render(request,'user_edit.html',{'form':form})

def user_delete(request,nid):
    models.UserInfo.objects.filter(id=nid).delete()
    return redirect("/user/list/")